home *** CD-ROM | disk | FTP | other *** search
/ TPUG - Toronto PET Users Group / TPUG Users Group CD / TPUG Users Group CD.iso / CRS / crs53.d81 / 28may87s.pma / CXKRNL.ASM < prev    next >
Assembly Source File  |  1979-12-31  |  16KB  |  763 lines

  1.     title    'Root module of relocatable BIOS for CP/M 3.0 28 Aug 85'
  2.  
  3. ; version 1.0    5 Sept 84
  4.  
  5.  
  6.     maclib    cxequ            ; C128 equates lib
  7.  
  8.     maclib    modebaud        ; define mode bits
  9.  
  10.     maclib    Z80
  11.  
  12. ;          Copyright (C), 1982
  13. ;         Digital Research, Inc
  14. ;             P.O. Box 579
  15. ;        Pacific Grove, CA  93950
  16. ;
  17. ;
  18. ;   This is the invariant portion of the modular BIOS and is
  19. ;    distributed as source for informational purposes only.
  20. ;    All desired modifications should be performed by
  21. ;    adding or changing externally defined modules.
  22. ;    This allows producing "standard" I/O modules that
  23. ;    can be combined to support a particular system 
  24. ;    configuration.
  25.  
  26. bell    equ    7
  27. ctlQ    equ    'Q'-'@'
  28. ctlS    equ    'S'-'@'
  29.  
  30. ccp    equ    0100h            ; Console Command Processor
  31.                     ; gets loaded into the TPA
  32.  
  33.     page
  34.  
  35.     cseg                ; GENCPM puts CSEG stuff in
  36.                     ; common memory
  37.  
  38. ; variables in system data page
  39.  
  40.     extrn    @covec,@civec
  41.     extrn    @aovec
  42.     extrn    @aivec,@lovec        ; I/O redirection vectors
  43.     extrn    @mxtpa            ; addr of system entry point
  44.     extrn    @bnkbf            ; 128 byte scratch buffer
  45.  
  46. ; initialization
  47.  
  48.     extrn    ?init            ; general initialization and signon
  49.     extrn    ?ldccp,?rlccp        ; load & reload CCP for BOOT & WBOOT
  50.  
  51. ; user defined character I/O routines
  52.  
  53.     extrn    ?ci,?co,?cist,?cost    ; each take device in <B>
  54.     extrn    ?cinit            ; (re)initialize device in <C>
  55.     extrn    @ctbl            ; physical character device table
  56.  
  57. ; disk communication data items
  58.  
  59.     extrn    @dtbl            ; table of pointers to XDPHs
  60.  
  61. ; memory control
  62.  
  63.     extrn    ?xmove,?move        ; select move bank, and block move
  64.     extrn    ?bank            ; select CPU bank
  65.  
  66. ; clock support
  67.  
  68.     extrn    ?time            ; signal time operation
  69.  
  70. ;; user function
  71.  
  72.     extrn    ?user            ; special functions
  73.  
  74. ; general utility routines
  75.  
  76.     public    ?pmsg            ; print message
  77.     public    ?pdec             ; print number from 0 to 65535
  78.     public    ?pderr            ; print BIOS disk error message header
  79.  
  80.  
  81.     page
  82.  
  83. ; External names for BIOS entry points
  84.  
  85.     public    ?boot,?wboot,?const,?conin,?cono,?list,?auxo,?auxi
  86.     public    ?home,?sldsk,?sttrk,?stsec,?stdma,?read,?write
  87.     public    ?lists,?sctrn
  88.     public    ?conos,?auxis,?auxos,?dvtbl,?devin,?drtbl
  89.     public    ?mltio,?flush,?mov,?tim,?bnksl,?stbnk,?xmov
  90.  
  91.  
  92. ; BIOS Jump vector.
  93. ;
  94. ; All BIOS routines are invoked by calling these
  95. ;    entry points.
  96.  
  97. ?boot:    jmp    boot        ; initial entry on cold start
  98. ?wboot:    jmp    wboot        ; reentry on program exit, warm start
  99.  
  100. ?const:    jmp    const        ; return console input status
  101. ?conin:    jmp    conin        ; return console input character
  102. ?cono:    jmp    conout        ; send console output character
  103. ?list:    jmp    list        ; send list output character
  104. ?auxo:    jmp    auxout        ; send auxilliary output character
  105. ?auxi:    jmp    auxin        ; return auxilliary input character
  106.  
  107. ?home:    jmp    home        ; set disks to logical home
  108. ?sldsk:    jmp    seldsk        ; select disk drive, return disk parameter info
  109. ?sttrk:    jmp    settrk        ; set disk track
  110. ?stsec:    jmp    setsec        ; set disk sector
  111. ?stdma:    jmp    setdma        ; set disk I/O memory address
  112. ?read:    jmp    read        ; read physical block(s)
  113. ?write:    jmp    write        ; write physical block(s)
  114.  
  115. ?lists:    jmp    listst        ; return list device status
  116. ?sctrn:    jmp    sectrn        ; translate logical to physical sector
  117.  
  118. ?conos:    jmp    conost        ; return console output status
  119. ?auxis:    jmp    auxist        ; return aux input status
  120. ?auxos:    jmp    auxost        ; return aux output status
  121. ?dvtbl:    jmp    devtbl        ; return address of device def table
  122. ?devin:    jmp    ?cinit        ; change baud rate of device
  123.  
  124. ?drtbl:    jmp    getdrv        ; return address of disk drive table
  125. ?mltio:    jmp    multio        ; set multiple record count for disk I/O
  126. ?flush:    jmp    flush        ; flush BIOS maintained disk caching
  127.  
  128. ?mov:    jmp    ?move        ; block move memory to memory
  129. ?tim:    jmp    ?time        ; Signal Time and Date operation
  130. ?bnksl:    jmp    bnksel        ; select bank for code execution
  131.                 ; and default DMA
  132. ?stbnk:    jmp    setbnk        ; select different bank for disk
  133.                 ; I/O DMA operations.
  134. ?xmov:    jmp    ?xmove        ; set source and destination banks
  135.                 ; for one operation
  136.  
  137.     jmp    ?user        ; reserved for future expansion
  138.     jmp    0        ; reserved for future expansion
  139.     jmp    0        ; reserved for future expansion
  140.  
  141.     page
  142. ;
  143. ; BOOT
  144. ;    Initial entry point for system startup.
  145.  
  146.     dseg            ; this part can be banked
  147. boot:
  148.     lxi    sp,boot$stack
  149.     mvi    c,15        ; initialize all 16 character devices
  150. c$init$loop:
  151.     push    b
  152.     call    ?cinit
  153.     pop    b
  154.     dcr    c
  155.     jp    c$init$loop
  156.  
  157.     call    ?init        ; perform any additional system initialization
  158.                 ; and print signon message
  159.     lxi    b,16*256+0
  160.     lxi    h,@dtbl        ; init all 16 logical disk drives
  161. d$init$loop:
  162.     push    b        ; save remaining count and abs drive
  163.     mov    e,m
  164.     inx    h
  165.     mov    d,m
  166.     inx    h        ; grab @drv entry
  167.     mov    a,e
  168.     ora    d
  169.     jrz    d$init$next    ; if null, no drive
  170.  
  171.     push    h        ; save @drv pointer 
  172.     xchg            ; XDPH address in <HL>
  173.     dcx    h
  174.     dcx    h
  175.     mov    a,m
  176.     sta    @RDRV        ; get relative drive code
  177.     mov    a,c
  178.     sta    @ADRV        ; get absolute drive code
  179.     dcx    h        ; point to init pointer
  180.     mov    d,m
  181.     dcx    h
  182.     mov    e,m        ; get init pointer
  183.     xchg
  184.     call    ipchl        ; call init routine
  185.     pop    h        ; recover @drv pointer
  186. d$init$next:
  187.     pop    b        ; recover counter and drive #
  188.     inr    c
  189.     djnz    d$init$loop    ; and loop for each drive
  190.     jmp    boot$1
  191.  
  192.     cseg            ; following in resident memory
  193. boot$1:
  194.     call    set$jumps
  195.     call    ?ldccp        ; fetch CCP for first time
  196.     jmp    ccp
  197.  
  198.     page
  199.  
  200. ; WBOOT
  201. ;    Entry for system restarts.
  202.  
  203. wboot:
  204.     lxi    sp,boot$stack
  205.     call    set$jumps    ; initialize page zero
  206.     call    ?rlccp        ; reload CCP
  207.     jmp    ccp        ; then reset jmp vectors and exit to ccp
  208.  
  209.  
  210. set$jumps:
  211.  
  212.  if banked
  213.     mvi    a,1
  214.     call    ?bnksl
  215.  endif
  216.  
  217.     mvi    a,JMP
  218.     sta    0
  219.     sta    5        ; set up jumps in page zero
  220.     lxi    h,?wboot
  221.     shld    1        ; BIOS warm start entry
  222.     lhld    @MXTPA
  223.     shld    6        ; BDOS system call entry
  224.     ret
  225.  
  226.  
  227.         ds 64
  228. boot$stack    equ $
  229.  
  230.     page
  231. ;
  232. ; DEVTBL
  233. ;    Return address of character device table
  234. devtbl:
  235.     lxi    h,@ctbl
  236.     ret
  237.  
  238. ;
  239. ; GETDRV
  240. ;    Return address of drive table
  241. getdrv:
  242.     lxi    h,@dtbl
  243.     ret
  244.  
  245.  
  246. ;
  247. ; CONOUT
  248. ;    Console Output.  Send character in <C>
  249. ;            to all selected devices
  250. conout:    
  251.     lhld    @covec        ; fetch console output bit vector
  252.     jmp    out$scan
  253.  
  254.  
  255. ;
  256. ; AUXOUT
  257. ;    Auxiliary Output. Send character in <C>
  258. ;            to all selected devices
  259. auxout:
  260.     lhld    @aovec        ; fetch aux output bit vector
  261.     jmp    out$scan
  262.  
  263.  
  264. ;
  265. ; LIST
  266. ;    List Output.  Send character in <C>
  267. ;            to all selected devices.
  268. list:
  269.     lhld    @lovec        ; fetch list output bit vector
  270.  
  271. out$scan:
  272.     mvi    b,0        ; start with device 0
  273. co$next:
  274.     dad    h        ; shift out next bit
  275.     jrnc    not$out$device
  276.     push    h        ; save the vector
  277.     push    b        ; save the count and character
  278. not$out$ready:
  279.     call    coster
  280.     ora    a
  281.     jrz    not$out$ready
  282.     pop    b
  283.     push    b        ; restore and resave the character and device
  284.     call    ?co        ; if device selected, print it
  285.     pop    b        ; recover count and character
  286.     pop    h        ; recover the rest of the vector
  287. not$out$device:
  288.     inr    b        ; next device number
  289.     mov    a,h
  290.     ora    l        ; see if any devices left
  291.     jrnz    co$next        ; and go find them...
  292.     ret
  293.  
  294.     page
  295. ;
  296. ; CONOST
  297. ;    Console Output Status.  Return true if
  298. ;        all selected console output devices
  299. ;        are ready.
  300. conost:
  301.     lhld    @covec        ; get console output bit vector
  302.     jr    ost$scan
  303.  
  304.  
  305. ;
  306. ; AUXOST
  307. ;    Auxiliary Output Status.  Return true if
  308. ;        all selected auxiliary output devices
  309. ;        are ready.
  310. auxost:
  311.     lhld    @aovec        ; get aux output bit vector
  312.     jr    ost$scan
  313.  
  314.  
  315. ;
  316. ; LISTST
  317. ;    List Output Status.  Return true if
  318. ;        all selected list output devices
  319. ;        are ready.
  320. listst:
  321.     lhld    @lovec        ; get list output bit vector
  322.  
  323. ost$scan:
  324.     mvi    b,0        ; start with device 0
  325. cos$next:
  326.     dad    h        ; check next bit
  327.     push    h        ; save the vector
  328.     push    b        ; save the count
  329.     mvi    a,0FFh        ; assume device ready
  330.     cc    coster        ; check status for this device
  331.     pop    b        ; recover count
  332.     pop    h        ; recover bit vector
  333.     ora    a        ; see if device ready
  334.     rz            ; if any not ready, return false
  335.     inr    b        ; drop device number
  336.     mov    a,h
  337.     ora    l        ; see if any more selected devices
  338.     jrnz    cos$next
  339.     ori    0FFh        ; all selected were ready, return true
  340.     ret
  341.  
  342. coster:                ; check for output device ready,
  343.                 ; including optional xon/xoff support
  344.     mov    l,b
  345.     mvi    h,0        ; make device code 16 bits
  346.     push    h        ; save it in stack
  347.     dad    h
  348.     dad    h        ; create offset into device
  349.     dad    h        ; characteristics tbl
  350.     lxi    d,@ctbl+6
  351.     dad    d        ; make address of mode byte
  352.     mov    a,m
  353.     ani    mb$xonxoff
  354.     pop    h        ; recover console number in <HL>
  355.     jz    ?cost        ; not a xon device, go get output status direct
  356.     lxi    d,xofflist
  357.     dad    d        ; make pointer to proper xon/xoff flag
  358.     call    cist1        ; see if this keyboard has character
  359.     mov    a,m
  360.     cnz    ci1        ; get flag or read key if any
  361.     cpi    ctlq
  362.     jrnz    not$q        ; if its a ctl-Q,
  363.     mvi    a,0FFh         ;    set the flag ready
  364. not$q:
  365.     cpi    ctls
  366.     jrnz    not$s        ; if its a ctl-S,
  367.     mvi    a,00h        ;    clear the flag
  368. not$s:
  369.     mov    m,a        ; save the flag
  370.     call    cost1        ; get the actual output status,
  371.     ana    m        ; and mask with ctl-Q/ctl-S flag
  372.     ret            ; return this as the status
  373.  
  374. cist1:                ; get input status with <BC> and <HL> saved
  375.     push    b
  376.     push    h 
  377.     call    ?cist
  378.     pop    h
  379.     pop    b
  380.     ora    a
  381.     ret
  382.  
  383. cost1:                ; get output status, saving <BC> & <HL>
  384.     push    b
  385.     push    h
  386.     call    ?cost
  387.     pop    h
  388.     pop    b
  389.     ora    a
  390.     ret
  391.  
  392. ci1:                ; get input, saving <BC> & <HL>
  393.     push    b
  394.     push    h
  395.     call    ?ci
  396.     pop    h
  397.     pop    b
  398.     ret
  399.  
  400.     page
  401. ;
  402. ; CONST
  403. ;    Console Input Status.  Return true if
  404. ;        any selected console input device
  405. ;        has an available character.
  406. const:
  407.     lhld    @civec        ; get console input bit vector
  408.     jr    ist$scan
  409.  
  410.  
  411. ;
  412. ; AUXIST
  413. ;    Auxiliary Input Status.  Return true if
  414. ;        any selected auxiliary input device
  415. ;        has an available character.
  416. auxist:
  417.     lhld    @aivec        ; get aux input bit vector
  418.  
  419. ist$scan:
  420.     mvi    b,0        ; start with device 0
  421. cis$next:
  422.     dad    h        ; check next bit
  423.     mvi    a,0        ; assume device not ready
  424.     cc    cist1        ; check status for this device
  425.     ora    a
  426.     rnz            ; if any ready, return true
  427.     inr    b        ; drop device number
  428.     mov    a,h
  429.     ora    l        ; see if any more selected devices
  430.     jrnz    cis$next
  431.     xra    a        ; all selected were not ready, return false
  432.     ret
  433.  
  434.     page
  435. ;
  436. ; CONIN
  437. ;    Console Input.  Return character from first
  438. ;        ready console input device.
  439. conin:
  440.     lhld    @civec
  441.     jr    in$scan
  442.  
  443.  
  444. ; AUXIN
  445. ;    Auxiliary Input.  Return character from first
  446. ;        ready auxiliary input device.
  447. auxin:
  448.     lhld    @aivec
  449.  
  450. in$scan:
  451.     push    h        ; save bit vector
  452.     mvi    b,0
  453. ci$next:
  454.     dad    h        ; shift out next bit
  455.     mvi    a,0        ; insure zero a  (nonexistant device not ready).
  456.     cc    cist1        ; see if the device has a character
  457.     ora    a
  458.     jrnz    ci$rdy        ; this device has a character
  459.     inr    b        ; else, next device
  460.     mov    a,h
  461.     ora    l        ; see if any more devices
  462.     jrnz    ci$next        ; go look at them
  463.     pop    h        ; recover bit vector
  464.     jr    in$scan        ; loop til we find a character
  465.  
  466. ci$rdy:
  467.     pop    h        ; discard extra stack
  468.     jmp    ?ci
  469.  
  470.     page
  471.  
  472. ;    Utility Subroutines
  473.  
  474.  
  475. ?pmsg:                ; print message @<HL> up to a null
  476.                 ; saves <BC> & <DE>
  477.     push    b
  478.     push    d
  479. pmsg$loop:
  480.     mov    a,m
  481.     ora    a
  482.     jrz    pmsg$exit
  483.     mov    c,a
  484.     push    h
  485.     call    ?cono
  486.     pop    h
  487.     inx    h
  488.     jr    pmsg$loop
  489. pmsg$exit:
  490.     pop    d
  491.     pop    b
  492.     ret
  493.  
  494. ?pdec:                ; print binary number 0-65535 from <HL>
  495.     lxi    b,table10
  496.     lxi    d,-10000
  497. next:
  498.     mvi    a,'0'-1
  499. pdecl:
  500.     push    h
  501.     inr    a
  502.     dad    d
  503.     jrnc    stoploop
  504.     inx    sp
  505.     inx    sp
  506.     jr    pdecl
  507. stoploop:
  508.     push    d
  509.     push    b
  510.     mov    c,a
  511.     call    ?cono
  512.     pop    b
  513.     pop    d
  514. nextdigit:
  515.     pop    h
  516.     ldax    b
  517.     mov    e,a
  518.     inx    b
  519.     ldax    b
  520.     mov    d,a
  521.     inx    b
  522.     mov    a,e
  523.     ora    d
  524.     jrnz    next
  525.     ret
  526.  
  527. table10:
  528.     dw    -1000,-100,-10,-1,0
  529.  
  530.  
  531. ?pderr:
  532.     lxi    h,drive$msg
  533.     call    ?pmsg            ; error header
  534.     lda    @adrv
  535.     adi    'A'
  536.     mov    c,a
  537.     call    ?cono            ; drive code
  538.     lxi    h,track$msg
  539.     call    ?pmsg            ; track header
  540.     lhld    @trk
  541.     call    ?pdec            ; track number
  542.     lxi    h,sector$msg
  543.     call    ?pmsg            ; sector header
  544.     lhld    @sect
  545.     jr    ?pdec            ; sector number (call/ret)
  546.  
  547.  
  548. ;
  549. ; BNKSEL
  550. ;    Bank Select.  Select CPU bank for further execution.
  551. bnksel:
  552.     sta    @cbnk             ; remember current bank
  553.     jmp    ?bank            ; and go exit through users
  554.                     ; physical bank select routine
  555.  
  556.  
  557. xofflist:
  558.     db    -1,-1,-1,-1,-1,-1,-1,-1        ; ctl-s clears to zero
  559.     db    -1,-1,-1,-1,-1,-1,-1,-1
  560.  
  561.  
  562.  
  563.     dseg            ; following resides in banked memory
  564.  
  565.  
  566.  
  567. ;    Disk I/O interface routines
  568. ;
  569. ; SELDSK
  570. ;    Select Disk Drive.  Drive code in <C>.
  571. ;        Invoke login procedure for drive
  572. ;        if this is first select.  Return
  573. ;        address of disk parameter header
  574. ;        in <HL>
  575. seldsk:
  576.     mov    a,c
  577.     sta    @adrv            ; save drive select code
  578.     mov    l,c
  579.     mvi    h,0
  580.     dad    h            ; create index from drive code
  581.     lxi    b,@dtbl
  582.     dad    b            ; get pointer to dispatch table
  583.     mov    a,m
  584.     inx    h
  585.     mov    h,m
  586.     mov    l,a            ; point at disk descriptor
  587.     ora    h
  588.     rz                 ; if no entry in table, no disk
  589.     mov    a,e
  590.     ani    1
  591.     jrnz    not$first$select    ; examine login bit
  592.     push    h
  593.     xchg                ; put pointer in stack & <DE>
  594.     lxi    h,-2
  595.     dad    d
  596.     mov    a,m
  597.     sta    @RDRV            ; get relative drive
  598.     lxi    h,-6
  599.     dad    d            ; find LOGIN addr
  600.     mov    a,m
  601.     inx    h
  602.     mov    h,m
  603.     mov    l,a            ; get address of LOGIN routine
  604.     call    ipchl            ; call LOGIN
  605.     pop    h            ; recover DPH pointer
  606. not$first$select:
  607.     ret
  608.  
  609.     page
  610. ;
  611. ; HOME
  612. ;    Home selected drive.  Treated as SETTRK(0).
  613. home:
  614.     lxi    b,0            ; same as set track zero
  615.  
  616.  
  617. ;
  618. ; SETTRK
  619. ;    Set Track. Saves track address from <BC> 
  620. ;        in @TRK for further operations.
  621. settrk:
  622.     mov    l,c
  623.     mov    h,b
  624.     shld    @trk
  625.     ret
  626.  
  627.  
  628. ;
  629. ; SETSEC
  630. ;    Set Sector.  Saves sector number from <BC>
  631. ;        in @sect for further operations.
  632. setsec:
  633.     mov    l,c
  634.     mov    h,b
  635.     shld    @sect
  636.     ret
  637.  
  638.  
  639. ;
  640. ; SETDMA
  641. ;    Set Disk Memory Address.  Saves DMA address
  642. ;        from <BC> in @DMA and sets @DBNK to @CBNK
  643. ;        so that further disk operations take place
  644. ;        in current bank.
  645. setdma:
  646.     mov    l,c
  647.     mov    h,b
  648.     shld    @dma
  649.     lda    @cbnk        ; default DMA bank is current bank
  650.                 ; fall through to set DMA bank
  651.  
  652. ;
  653. ; SETBNK
  654. ;    Set Disk Memory Bank.  Saves bank number
  655. ;        in @DBNK for future disk data
  656. ;        transfers.
  657. setbnk:
  658.     sta    @dbnk
  659.     ret
  660.  
  661.     page
  662. ;
  663. ;    
  664. ; SECTRN
  665. ;    Sector Translate.  Indexes skew table in <DE>
  666. ;        with sector in <BC>.  Returns physical sector
  667. ;        in <HL>.  If no skew table (<DE>=0) then
  668. ;        returns physical=logical.
  669. sectrn:
  670.     mov    l,c
  671.     mov    h,b
  672.     mov    a,d
  673.     ora    e
  674.     rz
  675.     xchg
  676.     dad    b
  677.     mov    l,m
  678.     mvi    h,0
  679.     ret
  680.  
  681.     page
  682. ;
  683. ; READ
  684. ;    Read physical record from currently selected drive.
  685. ;        Finds address of proper read routine from
  686. ;        extended disk parameter header (XDPH).
  687. read:
  688.     lhld    @adrv
  689.     mvi    h,0
  690.     dad    h            ; get drive code and double it
  691.     lxi    d,@dtbl
  692.     dad    d            ; make address of table entry
  693.     mov    a,m
  694.     inx    h
  695.     mov    h,m
  696.     mov    l,a            ; fetch table entry
  697.     push    h            ; save address of table
  698.     lxi    d,-8
  699.     dad    d            ; point to read routine address
  700.     jr    rw$common        ; use common code
  701.  
  702.  
  703. ;
  704. ; WRITE
  705. ;    Write physical sector from currently selected drive.
  706. ;        Finds address of proper write routine from
  707. ;        extended disk parameter header (XDPH).
  708. write:
  709.     lhld    @adrv
  710.     mvi    h,0
  711.     dad    h            ; get drive code and double it
  712.     lxi    d,@dtbl
  713.     dad    d            ; make address of table entry
  714.     mov    a,m
  715.     inx    h
  716.     mov    h,m
  717.     mov    l,a            ; fetch table entry
  718.     push    h            ; save address of table
  719.     lxi    d,-10
  720.     dad    d            ; point to write routine address
  721.  
  722. rw$common:
  723.     mov    a,m
  724.     inx    h
  725.     mov    h,m
  726.     mov    l,a            ; get address of routine
  727.     pop    d            ; recover address of table
  728.     dcx    d
  729.     dcx    d            ; point to relative drive
  730.     ldax    d
  731.     sta    @rdrv            ; get relative drive code and post it
  732.     inx    d
  733.     inx    d            ; point to DPH again
  734. ipchl:
  735.     pchl                ; leap to driver
  736.  
  737.     page
  738. ;
  739. ; MULTIO
  740. ;    Set multiple sector count. Saves passed count in
  741. ;        @CNT
  742. multio:
  743.     sta    @cnt
  744.     ret
  745.  
  746. ;
  747. ; FLUSH
  748. ;    BIOS deblocking buffer flush.  Not implemented.
  749. flush:
  750.     xra    a
  751.     ret                ; return with no error
  752.  
  753.  
  754. ;
  755. ; error message components
  756. ;
  757. drive$msg:    db    cr,lf,bell,'BIOS Error on ',0
  758. track$msg:    db    ': T-',0
  759. sector$msg:    db    ', S-',0
  760.  
  761.  
  762.     end
  763.